﻿#pragma once
#ifndef GLOBAL_H
#define GLOBAL_H
#include <QMutex>
#include "PublicGlobal.h"
#include "CQLogView.h"


class QOraclDbThread;
class AccessDbThread;
class CSyncDbThread;
//D9151设备
typedef bool(__stdcall * RfidCallBack)(char *szNoirmalData, unsigned char* uchStoreData, int nStoreDataLen);   //IO设备 回调函数
typedef bool(__stdcall * SetOperateCallBack)(RfidCallBack lpRfidCallBack);  // 设置回调函数
typedef bool(__stdcall * StartRfidModule)(int nDeviceType, char * szErrMsg);  // 启动RFID指定模块
typedef bool(__stdcall * StopRfidModule)(int nDeviceType, char * szErrMsg);  //  停止RFID指定模块
typedef bool(__stdcall * GetRfidDeviceState)(int nDeviceType, char * szDeviceNo, int *nState, char * szErrMsg);  // 获取硬件状态
typedef bool(__stdcall * RfidReadData)(int nDeviceType, const char * szDeviceNo, char *chData, char * szErrMsg);  // 获取硬件状态
typedef bool(__stdcall * RfidWriteData)(int nDeviceType, const char * szDeviceNo, const char *chData, char * szErrMsg);  // 获取硬件状态

//打开读码设备
typedef bool(__stdcall *fpStartCodeDevice)(const char* szDeviceId, const char* szConfig);

//读码
typedef bool(__stdcall *fpReadCode)(unsigned char block, wchar_t* TData);

//写码
typedef bool(__stdcall *fpWriteCode)(unsigned char block, unsigned char* Buf);

//关闭读码设备
typedef bool(__stdcall *fpStopCodeDevice)(unsigned char* Buf);

//获取读码设备状态
typedef void(__stdcall *fpGetDevStatus)(unsigned char* Uid, int* nState);

//标签热敏打印机
typedef int(__stdcall *fpPrintLabel)(char *size, char *code, char * time);

//地磅数据回调（char*:该地磅设备的ID号 int:cmd命令 float:重量数据）
typedef bool(__stdcall*OperateCallBack)(const char*, const int enCmd, const float);

//启用所有地磅模块
typedef bool(__stdcall*lpStartAllWeightBridge)(OperateCallBack lpOperateCallBack, char* szRunDesc);

//启用指定地磅模块
typedef bool(__stdcall*lpStartWeightBridge)(OperateCallBack lpOperateCallBack, const char* szDeviceId, char* szRunDesc);


//获得当前地磅称重重量
typedef bool(__stdcall*lpGetNowWeight)(const char* szDeviceId, char* szRunDesc);

//获取地磅状态
typedef bool(_stdcall *lpGetDeviceState)(const char* szDeviceId, int* nState, char* szRunDesc);

//地磅清零
typedef bool(__stdcall*lpResetNowWeight)(const char* szDeviceId, char* szRunDesc);


//关闭所有地磅模块
typedef bool(__stdcall*lpStopAllWeightBridge)(char* szRunDesc);


//关闭指定地磅
typedef bool(__stdcall*lpStopWeightBridge)(const char* szDeviceId, char* szRunDesc);

//数据库读取缓存数据列 利用vector数组结构构造一维字符串数组
typedef QVector<QString> QStrs;

//数据库读取缓存数据行 利用vector数组结构构造二维字符串数组
typedef QVector<QStrs> QDStrs;

//数据库操作类型
enum enumDbOperType
{
	enUnKnowDbOperType,
	enQTDriver,//暂定只有一个选项
};

//数据库类型
enum enumDbType
{
	enUnKnowDbType,
	enOracle,
	enSqlServer,
	enAccess,
	enMySql,
	enSqlite,
};

enum enumSqlType
{
	enenThreeLevelCode,//三级编码表
	enSamReg,//样品登记表
	enMsReCode,//制样记录表,
	enCZH_ZY_USER,//制样用户表
	enVendorInfo,
};

//供应商信息表
struct VendorInfoTable
{

	enum enumOpType
	{
		enQueryAll,	//查全部
		enQueryNotDeleted,	//查未逻辑删除的
		enQueryPartial,	//条件查
		enQueryMax,	//查最大编号
		enInsert,	//增
		enUpdate,	//改
		enDelete,	//删
		enQueryName,//查询名称
		enDeleteAll,//删除(非逻辑删除)
	};
	int  nOpType;            //数据库操作类型
	int  nVenNo;             //供应商编号
	char szVenName[128];     //供应商名称
	char szLealPerson[64];   //法人代表
	char szVenAddr[128];     //供应商地址
	char szContNum[64];      //联系电话
	char szContPerson[64];   //联系人
	char szRemark[128];      //备注
	char szOperName[64];     //操作人员
	char szEditTime[64];     //操作时间
	int  nPlaceNo;           //装卸位置编号

	VendorInfoTable()
	{
		memset(this, 0, sizeof(VendorInfoTable));
	}
};

//三级编码表
struct CZH_ZY_USERTable
{
	int nOpType;
	char szLOGIN_ACCOUNT[64];
	char szBLOGIN_PWD[64];
	char szROLE_LEVEL[64];

	CZH_ZY_USERTable()
	{
		memset(this, 0, sizeof(CZH_ZY_USERTable));
	}
};

//三级编码表
struct ThreeLevelCodeTable
{

	enum enumOpType
	{
		enAuto1,
		enAuto2,
		enAuto3,
		enAuto4,
		enAuto5,
		enQueryNotDeleted,	//查未逻辑删除的
		enQueryPartial,	//条件查
		enQueryMax,	//查最大编号
		enUpdate,	//改
		enDelete,	//删
		enQueryName,//查询名称
		enInsert,	//增
		enQueryAll,	//查全部
		enDeleteAll,//删除(非逻辑删除)
		enPrintHYM,//查化验码
		enPrintSAM,//查采样码
	};
	int nOpType;                    //0:根据采样编码查询出制样编码 1:根据制样码、化验码查询三级编码表的记录条数 2:增加新的三级编码记录
	char szProviderNo[64];      //供煤商编号
	char szBatchNo[64];        //采样批次
	char szInsertDate[64];      //插入数据的时间        
	char szSampleCode[64];      //采样编码
	char szMakeSampleCode[64];    //制样编码
	char szExamineSampleCode[64];  //化样编码
	char szCoalType[64];      //煤种类型
	char szCodeType[64];            //编码类型
	char szDevNo[64];               //机组编号
	ThreeLevelCodeTable()
	{
		memset(this, 0, sizeof(ThreeLevelCodeTable));
	}
};

//样品登记表
struct SampleRegTable
{
	int nOpType;                    //0:插入数据 1:根据时间删除对应的记录 2.更新重量 3:根据时间段查询记录 4:根据时间段和采样码查询 5:根据采样码查询
	int nNo;                    //数据库编号
	char strSampleCode[125];    //采样码
	char strSampleWeight[125];  //样品重量
	char strInsertTime[125];   //插入时间
	char strStartTime[125];   //根据时间查询的时候用到
	char strEndTime[125];    //根据时间查询的时候用到
	char strRemarks[125];     //备注
	SampleRegTable()
	{
		memset(this, 0, sizeof(SampleRegTable));
	}
};

//制样记录表
struct MsReCodeTable
{
	int nOpType;     //0：根据制样码查找制样记录 1：插入记录 2:更新数据 3.根据时间段查询记录  4.根据时间段和制样码查询
	char strIsSubmit[16];//是否提交
	char strMsDeviceID[64];
	char strProviderNo[64];
	char strMakeSampleCode[125];//制样编码
	char strTHREEMMPUNTCODE[64];
	char strSIXMMPUNTCODE1[64];
	char strSIXMMPUNTCODE2[64];//6mm存查样码
	char strTWOMMPUNTCODE1[64];
	char strTWOMMPUNTCODE2[64];//0.2mm存查样码
	char strTWOMMPUNTCODE3[64];
	char strTWOMMPUNTCODE4[64];
	char strTHREEMMPUNTWEIGHT[64];
	char strSIXMMPUNT1WEIGHT[64];
	char strSIXMMPUNT2WEIGHT[64];//6mm存查样重量
	char strTWOMMPUNT1WEIGHT[64];
	char strTWOMMPUNT2WEIGHT[64];//0.2mm存查样重量
	char strTWOMMPUNT3WEIGHT[64];
	char strTWOMMPUNT4WEIGHT[64];
	char strSTARTTIME[64];
	char strENDTIME[64];
	char strEDITMODE[64];
	char strOPERATERNAME[64];
	char strSampleWeight[64];
	char strType[8];
	MsReCodeTable()
	{
		memset(this, 0, sizeof(MsReCodeTable));
	}
};

struct DbOperContent
{
	enumSqlType enDbSqlType;
	bool bIsAsynExec;//是否需要异步执行 0：同步  1：异步
	ThreeLevelCodeTable* pThreeLevelCodeTable;//三级编码表
	SampleRegTable* pSampleRegTable;//样品登记表
	MsReCodeTable* pMsReCodeTable; //制样记录表
	CZH_ZY_USERTable* pCZH_ZY_USERTable;//制样用户表
	VendorInfoTable* pVendorInfoTable;//供应商表

	DbOperContent(enumSqlType sqlType, bool _bIsAsynExec = 0)
	{
		memset(this, 0, sizeof(DbOperContent));
		enDbSqlType = sqlType;
		bIsAsynExec = _bIsAsynExec;
		switch (enDbSqlType)
		{
		case enenThreeLevelCode:
			pThreeLevelCodeTable = new ThreeLevelCodeTable();
			break;
		case enSamReg:
			pSampleRegTable = new SampleRegTable();
			break;
		case enMsReCode:
			pMsReCodeTable = new MsReCodeTable();
			break;
		case enCZH_ZY_USER:
			pCZH_ZY_USERTable = new CZH_ZY_USERTable();
			break;
		case enVendorInfo:
			pVendorInfoTable = new VendorInfoTable();
			break;
		default: break;
		}
	}

	~DbOperContent()
	{
		SAFE_DELETE(pThreeLevelCodeTable);
	}
};

//全局变量

struct SamRegItem
{
	bool isChecked;                    //0:没有选中  1:选中
	bool isSubmitOK;                   //1:提交成功  0:提交失败
	char strSampleCode[125];    //采样码
	char strSampleWeight[125];  //样品重量
	char strInsertTime[125];   //插入时间
	char strRemarks[125];     //备注
	SamRegItem()
	{
		memset(this, 0, sizeof(SamRegItem));
	}
};

struct  MakeSamRegItem
{
	bool isChecked;                    //0:没有选中  1:选中
	char strIsSubmit[16];//是否提交
	char strMsDeviceID[64];
	char strProviderNo[64];
	char strMakeSampleCode[125];//制样编码
	char strTHREEMMPUNTCODE[64];//3mm分析样码
	char strSIXMMPUNTCODE1[64];//6mm分析样码
	char strSIXMMPUNTCODE2[64];//6mm存查样码
	char strTWOMMPUNTCODE1[64];
	char strTWOMMPUNTCODE2[64];//0.2mm存查样码
	char strTWOMMPUNTCODE3[64];//0.2mm分析样码
	char strTWOMMPUNTCODE4[64];
	char strTHREEMMPUNTWEIGHT[64];
	char strSIXMMPUNT1WEIGHT[64];
	char strSIXMMPUNT2WEIGHT[64];//6mm存查样重量
	char strTWOMMPUNT1WEIGHT[64];
	char strTWOMMPUNT2WEIGHT[64];//0.2mm存查样重量
	char strTWOMMPUNT3WEIGHT[64];
	char strTWOMMPUNT4WEIGHT[64];
	char strSTARTTIME[64];
	char strENDTIME[64];
	char strEDITMODE[64];
	char strOPERATERNAME[64];
	char strSampleWeight[64];
	MakeSamRegItem()
	{
		memset(this, 0, sizeof(MakeSamRegItem));
	}
};

extern QVector<SamRegItem*> g_vecSamRegItem;
extern QVector<MakeSamRegItem*> g_vecMakeSamRegItem;
extern QMap<QString, float> g_mapSamReg;
extern QMutex g_csLock;//g_vecSamReg锁
extern int g_nProjectNo;  //项目标识
extern int g_n6mm1PrintNum;//6mm分析样规格码打印张数
extern int g_n6mm2PrintNum;//6mm存查样规格码打印张数
extern int g_n3mmPrintNum;//3mm规格码打印张数
extern int g_n2mm3PrintNum;//0.2mm分析样规格码打印张数
extern int g_n2mm2PrintNum;//0.2mm存查样规格码打印张数
extern int g_nSampleCodePrintNum;//采样码打印张数
extern int g_nChangedFlag;
extern float g_fStandWeight;

extern QString g_strOperName;
extern QString g_strRoleLevel;//全局用户权限级别

extern QOraclDbThread* g_pDbThread;//oracle数据库线程

extern AccessDbThread* g_pLocalDbThread;//操作本地Access数据库线程全局

extern AccessDbThread* g_paccessDbThread;//同步Access数据库线程全局

extern int g_nIsOpenPrintExamineCode;

extern int g_nOracleorAccess; //1:Oracle,2:Access

extern CSyncDbThread* g_pSyncDbThread;//同步操作线程

#endif